# -*- coding: utf-8 -*-

 ###############################################
 ##                                             ##
 ##  Model (Ventas)                              ##
 ##                                              ##
 ##                                              ##
 ##  for Basiq Series                            ##
 ##  by Críptidos Digitales                      ##
 ##  GPL (c)2008                                 ##
  ##                                             ##
    ###############################################

import sys

from decimal import Decimal as dec

import man
from man import *

#~ from modelo import *

from sqlalchemy.sql import func




# _activePriceRules = []
# for rule in _priceRules:
    # if rule['referencia'][1] == u'a':
        # activePriceRules.append(rule)







def activePriceRules():
    return _activePriceRules







def operaciones_documentos(operacion_id, documento_id):
    operacion = operacionI(id=operacion_id)
    documento = dameDocumento(id=documento_id)
    operacion.documentos.append(documento)
    man.session().add(operacion)
    man.session().commit()


def agregaCliente(datos):
    rol = rol(**datos)

    # entidad = Entidad(datos['personalidad'], datos['nombre'], datos['apellidos'], datos['fechanacimiento'], datos['rfc'], datos['curp'])

    # man.session().add(entidad)
    # man.session().flush()

    # rol = Rol(entidad.id, u'cliente')
    # rol.entidad = entidad

    # man.session().add(rol)
    # man.session().flush()

    # direccion = Direccion(rol.id, u'personal', datos['lugar'], datos['colonia'], datos['codigopostal'], '', datos['calle'])

    # contacto = Contacto(rol.id, u'Tel fijo', datos['telefono'])

    # rol.contactos = [contacto]
    # rol.direcciones = [direccion]

    # man.session().commit()

    return rol


        # producto = productoI(id=partida.producto_id)
        # producto.actual -= partida.cantidad
    # man.session().flush()


# def dameAcepcion(**filtros):
    # try:
        # if not filtros.has_key('status'):
            # filtros['status'] = u'actual'
        # registro = man.session().query(Acepcion).filter_by(**filtros).one()
    # except:
        # print sys.exc_info()
        # print filtros

    # return registro


def dameAcepcionesX(**filtros):
    registros = []
    if filtros.has_key('rol_id'):
        if filtros.has_key('clasificacion'):
            clasificacion = dameClasificacion(valor=filtros['clasificacion'])
            if filtros.has_key('nombre'):
                if filtros.has_key('codigo'):
                    registros = man.session().query(Acepcion).filter(Acepcion.status==u'actual').filter(func.lower(Acepcion.codigo).like(("%s%%" % filtros['codigo']).lower())).filter(func.lower(Acepcion.nombre).like(("%s%%" % filtros['nombre']).lower())).filter(Acepcion.rol_id==filtros['rol_id']).join(Producto).filter(Producto.clasificacion==filtros['clasificacion']).order_by(Acepcion.nombre).all()
                else:
                    registros = man.session().query(Acepcion).filter(Acepcion.status==u'actual').filter(func.lower(Acepcion.nombre).like(("%s%%" % filtros['nombre']).lower())).filter(Acepcion.rol_id==filtros['rol_id']).join(Producto).filter(Producto.clasificacion==clasificacion).order_by(Acepcion.nombre).all()
            elif filtros.has_key('codigo'):
                registros = man.session().query(Acepcion).filter(Acepcion.status==u'actual').filter(func.lower(Acepcion.codigo).like(("%s%%" % filtros['codigo']).lower())).filter(Acepcion.rol_id==filtros['rol_id']).join(Producto).filter(Producto.clasificacion==filtros['clasificacion']).order_by(Acepcion.codigo).all()
        else:
            if filtros.has_key('nombre'):
                if filtros.has_key('codigo'):
                    registros = man.session().query(Acepcion).filter(Acepcion.status==u'actual').filter(func.lower(Acepcion.codigo).like(("%s%%" % filtros['codigo']).lower())).filter(func.lower(Acepcion.nombre).like(("%s%%" % filtros['nombre']).lower())).filter(Acepcion.rol_id==filtros['rol_id']).order_by(Acepcion.nombre).all()
                else:
                    registros = man.session().query(Acepcion).filter(Acepcion.status==u'actual').filter(func.lower(Acepcion.nombre).like(("%s%%" % filtros['nombre']).lower())).filter(Acepcion.rol_id==filtros['rol_id']).order_by(Acepcion.nombre).all()
                    # registros = man.session().query(Acepcion).filter(Acepcion.status==u'actual').filter(Acepcion.nombre.like("Emp%%")).filter(Acepcion.rol_id==filtros['rol_id']).order_by(Acepcion.nombre).all()
            elif filtros.has_key('codigo'):
                registros = man.session().query(Acepcion).filter(Acepcion.status==u'actual').filter(func.lower(Acepcion.codigo).like(("%s%%" % filtros['codigo']).lower())).filter(Acepcion.rol_id==filtros['rol_id']).order_by(Acepcion.codigo).all()
    else:
        if filtros.has_key('clasificacion'):
            if filtros.has_key('nombre'):
                registros = man.session().query(Acepcion).filter(Acepcion.status==u'actual').filter(func.lower(Acepcion.nombre).like(("%s%%" % filtros['nombre']).lower())).join(Producto).filter(Producto.clasificacion==filtros['clasificacion']).order_by(Acepcion.nombre).all()
            elif filtros.has_key('codigo'):
                registros = man.session().query(Acepcion).filter(Acepcion.status==u'actual').filter(func.lower(Acepcion.codigo).like(("%s%%" % filtros['codigo']).lower())).join(Producto).filter(Producto.clasificacion==filtros['clasificacion']).order_by(Acepcion.codigo).all()
        else:
            if filtros.has_key('nombre'):
                registros = man.session().query(Acepcion).filter(Acepcion.status==u'actual').filter(func.lower(Acepcion.nombre).like(("%s%%" % filtros['nombre']).lower())).order_by(Acepcion.nombre).all()
            elif filtros.has_key('codigo'):
                registros = man.session().query(Acepcion).filter(Acepcion.status==u'actual').filter(func.lower(Acepcion.codigo).like(("%s%%" % filtros['codigo']).lower())).order_by(Acepcion.codigo).all()
    return registros



def dameCliente(**filtros):
    if 'id' in filtros.keys():
        registro = rol(id=filtros['id'])
    else:
        if filtros.has_key('rfc'):
            registro = man.session().query(Rol).join(Entidad).filter(Entidad.nombre==filtros['nombre']).filter(Entidad.nombre2==filtros['nombre2']).filter(Entidad.rfc==filtros['rfc']).first()
        else:
            registro = man.session().query(Rol).join(Entidad).filter(Entidad.nombre==filtros['nombre']).filter(Entidad.nombre2==filtros['nombre2']).first()
    return registro


# def clienteDefault():
    # clienteDefaultId = int(atributoI(grupo=u'venta', nombre=u'clienteDefault').valor)
    # registro = rol(id=clienteDefaultId)
    # return registro


def dameClientes(**filtros):
    if filtros:
        registros = man.session().query(Rol).join(Entidad).filter(func.lower(Entidad.nombre).like(("%s%%" % filtros['nombre']).lower())).all()
    else:
        registros = man.session().query(Rol).filter(Rol.tipo==u'cliente').all()
    return registros


def documento(**filtros):
    try:
        registro = man.session().query(Documento).filter_by(**filtros).one()
        return registro
    except:
        print "Error en ventas.manejador.documento()"
        print "Filtros: %s" % filtros


def dameOperacion(**filtros):
    try:
        if 'cuenta' in filtros.keys():
            registro = man.session().query(Operacion).filter(Operacion.cuenta==filtros['cuenta']).filter(Operacion.documento_id==filtros['documento_id']).one()
        return registro
    except:
        print "Error:", sys.exc_info()[1]
        print "    ventas.manejador.dameOperacion(%s)" % filtros


# def dameProceso(**filtros):
    # registro = man.session().query(Proceso).filter(Proceso.proceso_id==filtros['id']).one()
    # return registro


def productoI(**filtros):
    registro = man.session().query(Producto).filter_by(**filtros).one()
    return registro


def dameUno(**filtros):
    f=g
    #! obsoleto, use documento()
    registro = man.session().query(Documento).filter(Documento.documento_id==filtros['id']).one()
    return registro


def dameVarios(**filtros):
    return []
    if 'sumasDiarias' in filtros.keys():
        fecha = filtros['inicio']
        totales = []

        while fecha <= filtros['termino']:
            ventas = dameVentasPorFecha(fecha)
            total = dec("0.00")
            for venta in ventas:
                total += venta.total
            totales.append({'fecha':fecha, 'total':total})
            fecha = fecha.addDays(1)
        return totales

    else:
        if 'cliente_id' in filtros.keys():
            registros = man.session().query(Documento).filter(Documento.rol_id==filtros['cliente_id']).filter(Documento.fecha>=filtros['inicio'].toPyDate()).filter(Documento.fecha<=filtros['termino'].toPyDate()).filter(Documento.tipo.in_([u'remisión', u'factura'])).join(Proceso).filter(func.lower(Proceso.tipo).in_([u'venta', u'servicio'])).order_by(Documento.fecha.desc()).all()
        else:
            registros = man.session().query(Documento).filter(Documento.fecha>=filtros['inicio'].toPyDate()).filter(Documento.fecha<=filtros['termino'].toPyDate()).filter(Documento.tipo.in_([u'remisión', u'factura'])).join(Proceso).filter(func.lower(Proceso.tipo).in_([u'venta', u'servicio'])).order_by(Documento.fecha.desc()).all()

    return registros


# def dameVentasPorFecha(fecha):
    # registros = man.session().query(Documento).filter(Documento.fecha==fecha).join(Atributo).filter(Atributo.nombre.in_([u'remisión', u'factura'])).join(Operacion).filter(Operacion.procesos.any(Proceso.tipo==u'venta')).all()

    # return registros


def elimina(**filtros):
    registro = man.session().query(Documento).filter(Documento.documento_id==filtros['id']).one()
    man.session().delete(registro)
    man.session().commit()

'''
def modificaFolio(folio, tipoDocumento):
    print "ventas.manejador.modificaFolio()"
    # print tipoDocumento.nombre.lower()
    if tipoDocumento.nombre.lower() == u'remisión':
        registro = atributoII(grupo=u'folioDocumento', nombre=u'ventaControl', valor=unicode(folio))
    elif tipoDocumento.nombre.lower() == u'factura':
        registro = atributoII(grupo=u'folioDocumento', nombre=u'ventaFiscal', valor=unicode(folio))
'''

def totalDeProductos():
    return man.session().query(func.count(Producto.id)).one()[0]-1





